import time
import warnings

from 程序核心代码.mvvm重构.基础定义.基础图形项.基础图形组件.子组件.通用基类.模型定义 import 组件模型基类, 组件节点图形项基类

#from 程序核心代码.图形界面.窗口及画布场景.opengl加速 import OpenGL加速组件

warnings.filterwarnings("ignore", message="'exec_' will be removed in the future. Use 'exec' instead.")

from PySide6.QtCore import Qt, QTimer, QThread, Signal, QObject
from PySide6.QtGui import QColor, QPainter
from PySide6.QtWidgets import QApplication, QGraphicsScene, QGraphicsView, QGraphicsRectItem
import logging
import random
import sys
import math  # 用于计算网格大小

# 配置日志记录
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

# 假设导入路径正确

class 具体模型类(组件模型基类):
    def __init__(self, 组件名称, **kwargs):
        super().__init__(组件名称, **kwargs)

class 具体图形项类(组件节点图形项基类):
    def __init__(self, 组件模型, 父项=None):
        super().__init__( 组件模型, 父项)
    def 组件初始化(self):
        self.组件 = QGraphicsRectItem(0, 0, 10, 10)
        self.注册属性触发函数("颜色", self.组件填充颜色更新)

    def 组件填充颜色更新(self):
        color = self.图形项属性.get("颜色")
        if color:
            self.组件.setBrush(QColor(color))
            self.组件.update()
            #日志记录器.info(f"组件当前实际颜色：{起始接口.组件.brush().color().name()}")

class 工作线程(QThread):
    模型准备就绪信号 = Signal(list)  # 发送模型列表

    def __init__(self, parent=None):
        super().__init__(parent)
        self.模型列表 = []
        self.定时器 = QTimer(self)
        self.定时器.timeout.connect(self.随机更新模型属性)

    def run(self):
        # 生成10000个模型
        print("工作线程开始运行")
        self.模型列表 = [具体模型类(f"组件_{i}", 颜色=Qt.red) for i in range(10000)]
        # 通知主线程模型准备就绪
        self.模型准备就绪信号.emit(self.模型列表)
        # 开始定时更新模型属性
        # 起始接口.定时器.start(2000)
        # 起始接口.exec_()  # 启动线程事件循环
        time.sleep(5)
        while True:
            # 等待2秒钟后随机更新模型属性
            #起始接口.sleep(1)
            self.随机更新模型属性()
            time.sleep(0.05)

    def 随机更新模型属性(self):
        # 随机选择部分模型
        #print("随机更新模型属性")
        随机数量 = random.randint(5000, 9999)
        随机模型列表 = random.sample(self.模型列表, 随机数量)
        for 模型 in 随机模型列表:
            # 随机选择属性（这里只更新颜色）
            属性名 = "颜色"
            # 随机选择颜色
            颜色列表 = [Qt.blue, Qt.green, Qt.yellow, Qt.gray, Qt.white, Qt.red]
            颜色 = random.choice(颜色列表)
            # 在主线程中设置模型属性
            模型.设置属性触发信号(属性名, 颜色)

class 使用示例(QObject):
    def __init__(self, 场景):
        super().__init__()
        self.图形项集合 = []  # 图形项列表
        self.场景 = 场景
        # 创建工作线程
        self.工作线程 = 工作线程()
        self.工作线程.模型准备就绪信号.connect(self.加载模型并生成图形项, Qt.QueuedConnection)
        self.工作线程.start()

    def 加载模型并生成图形项(self, 模型列表):
        logger.info("模型准备就绪，开始生成图形项")
        # print("加载模型并生成图形项")
        # print(f"模型数量：{len(模型列表)}")
        for 模型 in 模型列表:
            # print(f"加载模型：{基础模型.组件名称}")
            图形项 = 具体图形项类(模型)
            self.图形项集合.append(图形项)
        logger.info(f"生成图形项数量：{len(self.图形项集合)}")
        # 设置网格布局
        item_count = len(self.图形项集合)
        grid_size = math.ceil(math.sqrt(item_count))  # 计算网格大小，使其接近正方形
        item_width = 10  # 图形项的宽度
        item_height = 10  # 图形项的高度
        spacing = 5  # 图形项之间的间隔
        scene_width = (item_width + spacing) * grid_size
        scene_height = (item_height + spacing) * grid_size
        self.场景.setSceneRect(0, 0, scene_width, scene_height)
        for index, 图形项 in enumerate(self.图形项集合):
            row = index // grid_size
            col = index % grid_size
            x = col * (item_width + spacing)
            y = row * (item_height + spacing)
            图形项.组件.setPos(x, y)
            self.场景.addItem(图形项)
        logger.info("图形项加载完成")

if __name__ == "__main__":
    app = QApplication(sys.argv)
    场景 = QGraphicsScene()

    视图 = QGraphicsView(场景)
    gl_widget = OpenGL加速组件(视图)
    视图.setViewport(gl_widget)
    视图.setRenderHint(QPainter.Antialiasing, True) # 抗锯齿
    视图.setRenderHint(QPainter.SmoothPixmapTransform, True) # 平滑缩放
    视图.setOptimizationFlag(QGraphicsView.DontSavePainterState) # 优化绘制
    视图.setOptimizationFlag(QGraphicsView.DontAdjustForAntialiasing) # 优化抗锯齿

    示例 = 使用示例(场景)

    视图.show()

    sys.exit(app.exec())